const Crypto = require('./crypto.js');

(function() {

	// Shortcut
	var util = Crypto.util;

	Crypto.HMAC = function(hasher, message, key, options) {

		// Allow arbitrary length keys
		key = key.length > hasher._blocksize * 4 ?
			hasher(key, {
				asBytes: true
			}) :
			util.stringToBytes(key);

		// XOR keys with pad constants
		var okey = key,
			ikey = key.slice(0);
		for (var i = 0; i < hasher._blocksize * 4; i++) {
			okey[i] ^= 0x5C;
			ikey[i] ^= 0x36;
		}

		var hmacbytes = hasher(util.bytesToString(okey) +
			hasher(util.bytesToString(ikey) + message, {
				asString: true
			}), {
				asBytes: true
			});
		return options && options.asBytes ? hmacbytes :
			options && options.asString ? util.bytesToString(hmacbytes) :
			util.bytesToHex(hmacbytes);

	};
})();

module.exports = Crypto;
